#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : day05_分支和循环.py
# @Time : 2025/4/11 18:57
# -------------------------------
"""
100以内的素数
"""
for num in range(2, 100):
    is_prime = True
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            is_prime = False
            break
    if is_prime:
        print(f"100以内的素数是：{num}")

"""
** 属于幂运算符，它能计算一个数的指定次幂
"""
# num = 16
# print(num ** 0.5)   # 输出值：4.0

"""斐波那契额数列:斐波那契数列的特点是数列的前两个数都是 1，从第三个数开始，每个数都是它前面两个数的和。按照这个规律，
斐波那契数列的前 10 个数是：1, 1, 2, 3, 5, 8, 13, 21, 34, 55。
"""
# 输出斐波那契额数列中的20个数
a, b = 0, 1
for _ in range(20):
    a, b = b, a + b
    print(a)

"""例子3：寻找水仙花
要求：找出 100 到 999 范围内的所有水仙花数。

提示：在数论中，水仙花数（narcissistic number）也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数，它是一个 
 位非负整数，其各位数字的 N 次方和刚好等于该数本身，例如： 153 = 1^3 + 5^3 +3^3 ，所以 153 是一个水仙花数； 
 ，1634 = 1^4 + 6^4 + 3^4 + 4^4 所以 1634 也是一个水仙花数。对于三位数，解题的关键是将它拆分为个位、十位、百位，
 再判断是否满足水仙花数的要求，这一点利用 Python 中的//和%运算符其实很容易做到。

"""
# range函数，右闭
for num in range(100,1000):
    low = num % 10
    mid = num // 10 % 10
    high = num // 100
    if num == low ** 3 + mid ** 3 + high ** 3:
        print(f"符合水仙花数的数字num：{num}")
'''
# //整数除法运算；% 取模（取余）运算。示例如下所示：
total_seconds = 125
minutes = total_seconds // 60  # 2分钟
seconds = total_seconds % 60   # 5秒
print(f"{minutes}:{seconds}")  # 输出 "2:5"
'''

"""
百钱百鸡问题
说明：百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题：鸡翁一值钱五，鸡母一值钱三，鸡雏三值钱一。百钱买百鸡，问鸡翁、
鸡母、鸡雏各几何？翻译成现代文是：公鸡 5 元一只，母鸡 3 元一只，小鸡 1 元三只，用 100 块钱买一百只鸡，问公鸡、母鸡、小鸡各有多少只？
"""

for x in range(0,21):
    for y in range(0,34):
        z = 100 - x - y
        if 5*x + 3*y + (1/3)*z == 100:
            print(f"公鸡 {x} 只；母鸡 {y} 只；小鸡 {z} 只")


"""
CRAPS赌博游戏
玩家第一次摇骰子如果摇出了 7 点或 11 点，玩家胜；玩家第一次如果摇出 2 点、3 点或 12 点，庄家胜；玩家如果摇出其他点数则游戏继续，
玩家重新摇骰子，如果玩家摇出了 7 点，庄家胜；如果玩家摇出了第一次摇的点数，玩家胜；其他点数玩家继续摇骰子，直到分出胜负。
为了增加代码的趣味性，我们设定游戏开始时玩家有 1000 元的赌注，每局游戏开始之前，玩家先下注，如果玩家获胜就可以获得对应下注金额的奖励，
如果庄家获胜，玩家就会输掉自己下注的金额。游戏结束的条件是玩家破产（输光所有的赌注）。
"""

import random
money = 1000
while money > 0:
    print(f'你的总资产为：{money}元')
    # 下注金额必须大于0且小于等于玩家的总资产
    while True:
        debt = int(input('请下注:'))
        if 0 < debt <= money:
            break
    # 用两个1到6均匀分布的随机数相加模拟摇两颗色子得到的点数
    first_point = random.randrange(1, 7) + random.randrange(1, 7)
    print(f"\n 玩家摇出了{first_point}点")
    if first_point == 7 or first_point == 11:
        print(f'当前色子数是{first_point}')
        print('玩家胜！\n')
        money += debt
    elif first_point == 2 or first_point == 3 or first_point == 12:
        print(f'当前色子数是{first_point}')
        print('庄家胜！\n')
        money -= debt
    else:
    # 如果第一次摇色子没有分出胜负，玩家需要重新摇色子
        while True:
            current_point = random.randrange(1,7) + random.randrange(1,7)
            print(f"玩家摇出了{current_point}点")
            if current_point == 7:
                print('庄家胜！\n')
                money -= debt
                break
            elif current_point == first_point:
                print(f"玩家胜出！\n")
                money += debt
                break
print("你破产了，游戏结束！")

"""结优化点：
1.添加异常处理，防止输入非整数导致崩溃。
2.封装重复逻辑为函数，比如掷骰子部分。
3.优化代码结构，提高可读性。
4.添加资金检查，防止破产后的继续游戏。
5.考虑游戏规则的合理性，是否需要调整。
"""
# import random
# # # 初始化，启动资金1000元
# # money = 1000
# def roll_dice():
#     """模拟掷两颗骰子,返回2~12的随机点数"""
#     return random.randint(1,6) + random.randint(1,6)


# def first_round_judge(point,debt):
#     # 首次掷骰子规则判定
#     win_rules = {7:'player',11:'player',2:'house',3:'house',12:'house'}
#     if point in win_rules:
#         print(f"当前色子数：{point}")
#         winner = win_rules[point]
#         if winner == 'player':
#             print(f"玩家胜！")
#         else:
#             print(f"庄家胜！")
#         # print(f"{"玩家" if winner == 'player' else "庄家"}胜！\n")
#         return debt if winner == 'player' else -debt
#     return 0    # 进入第二阶段


# def game_round(money):
#     # 单局游戏逻辑，返回更新后的资金
#     print(f"\n 当前总资产：{money}元")

#     # 异常输入处理
#     while True:
#         try:
#             debt = int(input("请下注金额："))
#             if debt <= 0:
#                 print(f"下注金额必须大于0")
#             elif debt > money:
#                 print(f"下注金额不可超过当前资产{money}元")
#             else:
#                 break
#         except ValueError:
#             print(f"请输入有效的整数金额")
    
#     # 首次掷骰子
#     first_point = roll_dice()
#     print(f"首次掷骰结果：{first_point}点")

#     # 规则判定
#     if (result := first_round_judge(first_point,debt)) != 0:
#         return money + result
    
#     # 第二阶段掷骰子
#     print(f"目标点数：{first_point}点,庄家优势点数:7点")
#     while True:
#         current_point = roll_dice()
#         print(f"当前掷骰结果：{current_point}点")
#         if current_point == 7:
#             print("庄家优势！庄家胜\n")
#             return money - debt
#         elif current_point == first_point:
#             print(f"玩家达成目标!玩家胜\n")
#             return money + debt

# # 初始资金设置
# initial_money = 1000
# current_money = initial_money

# # 主游戏循环
# while current_money > 0:
#     current_money = game_round(current_money)
#     print(f"当前剩余资产：{current_money}元")

# print("\n游戏结束!你已破产")
# print(f"初始资产：{initial_money}元,最终资产:{current_money}元")
